import flash.net.URLRequest;
import flash.geom.Point;

var main;
var g;
var her;
var cMC:MovieClip = new MovieClip();
var setsettingsfilename = "deepthroatactionsV3";
var modSettingsLoader:Class;
var Droplet;

var deepthroatactions:Number = 1;
var gagondeepthroat:Number = 1;
var splatgenerateondeepthroat:Number = 0;
var splatsoundondeepthroat:Number = 0;
var pleasureincreaseondeepthroat:Number = 1;
var passoutfactorincreaseondeepthroat:Number = 1;
var shockondeepthroat:Number = 0;
var shockondeepthroatamount:Number = 60;
var winceinthroat:Number = 0;
var winceondeepthroat:Number = 1;
var winceondeepthroatholdtime:Number = 6;

var justdeepthroat:Number = 0;		///// flag
var justdeepthroattimer:Number = 0;		/////
var continueshockdecrease:Number = 0;	////	flag
var justhilttimer:Number = 0;		/////
var continueshockdecreasehilt:Number = 0;	////	flag
var shockondeepthroateyenormalizefasterrate:Number = 0.01;
var shockondeepthroateyenormalizefasterexporate:Number = 0.01;
var shockinthroat:Number = 0;

var hiltactions:Number =1;
var gagonhilt:Number =1;
var splatgenerateonhilt:Number =1;
var splatsoundonhilt:Number =0;
var pleasureincreaseonhilt:Number =1;
var hiltpleasureincreaserandom:Number =300;
var hiltpleasureincreasebase:Number =500;
var passoutfactorincreaseonhilt:Number =1;
var shockinhilt:Number =0;
var shockonhilt:Number =1;
var shockonhiltamount:Number =130;
var shockonhilteyenormalizefasterrate:Number =0.005;
var shockonhilteyenormalizefasterexporate:Number =0.05;
var winceinhilt:Number =1;
var winceonhilt:Number =0;
var winceonhiltholdtime:Number =6;

var splatgenerateondeepthroatamount:Number =1;
var splatgenerateondeepthroatmovementmult:Number =1;
var splatgenerateondeepthroatmovementbase:Number = 1;
var splatgenerateondeepthroatspeedmult:Number = 1;
var splatgenerateondeepthroatspeedbase:Number = 1;
var pleasureincreaseondeepthroatrandom:Number =1;
var pleasureincreaseondeepthroatbase:Number =1;
var passoutfactorincreaseondeepthroatrandom:Number =1;
var passoutfactorincreaseondeepthroatbase:Number =1;
var breathlevelincreaseondeepthroat:Number =1;
var breathlevelincreaseondeepthroatamountrandom:Number =1;
var breathlevelincreaseondeepthroatamountbase:Number =1;
var gagondeepthroatpercent:Number =1;
var winceondeepthroatpercent:Number =1;
var breathlevelincreaseinthroat:Number =1;
var breathlevelincreaseinthroatamountrandom:Number =1;
var breathlevelincreaseinthroatamountbase:Number =1;
var passoutfactorincreaseinthroat:Number =1;
var passoutfactorincreaseinthroatamountrandom:Number =1;
var passoutfactorincreaseinthroatamountbase:Number =1;
var pleasureincreaseindeepthroat:Number =1;
var pleasureincreaseindeepthroatrandom:Number =1;
var pleasureincreaseindeepthroatbase:Number =1;

var splatgenerateonhiltamount:Number =1;
var splatgenerateonhiltmovementmult:Number =1;
var splatgenerateonhiltmovementbase:Number = 1;
var splatgenerateonhiltspeedmult:Number = 1;
var splatgenerateonhiltspeedbase:Number = 1;

var pleasureincreaseonhiltrandom:Number =1;
var pleasureincreaseonhiltbase:Number =1;
var breathlevelincreaseonhilt:Number =1;
var breathlevelincreaseonhiltamountrandom:Number =1;
var breathlevelincreaseonhiltamountbase:Number =1;
var passoutfactorincreaseonhiltrandom:Number =1;
var passoutfactorincreaseonhiltbase:Number =1;
var gagonhiltpercent:Number =1;
var winceonhiltpercent:Number =1;
var breathlevelincreaseinhilt:Number =1;
var breathlevelincreaseinhiltamountrandom:Number =1;
var breathlevelincreaseinhiltamountbase:Number =1;
var pleasureincreaseinhilt:Number =1;
var pleasureincreaseinhiltrandom:Number =1;
var pleasureincreaseinhiltbase:Number =1;
var passoutfactorincreaseinhilt:Number =1;
var passoutfactorincreaseinhiltamountrandom:Number =1;
var passoutfactorincreaseinhiltamountbase:Number =1;
var preventpassoutincreaseswhenstillhavebreath:Number = 1;

function initl(l)			//boiler plate setup for getting settings started, put startup stuff here that are not dependent on loaded settings
{
	main = l;
	g = l.g;
	her = l.her;
	var msl = new modSettingsLoader(setsettingsfilename,settingsLoaded);
	msl.addEventListener("settingsNotFound",settingsNotFound);
}

function finishinit()			
{
	Droplet = main.eDOM.getDefinition("obj.Droplet") as Class;
	shockondeepthroatamount=Math.abs(int(shockondeepthroatamount));
	shockondeepthroateyenormalizefasterrate = Math.max(0,shockondeepthroateyenormalizefasterrate);
	shockondeepthroateyenormalizefasterexporate = Math.max(0,shockondeepthroateyenormalizefasterexporate);
	
	hiltpleasureincreaserandom=int(hiltpleasureincreaserandom);
	hiltpleasureincreasebase=int(hiltpleasureincreasebase);
	shockonhiltamount=Math.abs(int(shockonhiltamount));
	shockonhilteyenormalizefasterrate = Math.max(0,shockonhilteyenormalizefasterrate);
	shockonhilteyenormalizefasterexporate = Math.max(0,shockonhilteyenormalizefasterexporate);

	cMC.addEventListener(Event.ENTER_FRAME, doCheck);
	main.unloadMod();
	main.registerUnloadFunction(doUnload);
}

function settingsLoaded(e)			//load options file, set variables, repok variables
{
	var dict:Dictionary = e.settings;
	for (var key:Object in dict)
	{
		var val:Object = dict[key];
		if ( this.hasOwnProperty( key ) )			//checks if variable exists
		{
			this[key] = val;    								//replaces all switch statement variable assignments
			//main.updateStatusCol(key + " = "+ val,"#00ff00");   //replaces all switch statement updatestatus notifications, comment line to hide
			//main.monitorDebug(key+": ",this,key);				//sets variable to be tracked on the debug view
		}
		else
		{
			main.updateStatusCol("invalid setting: "+key,"#FF0000");	//displays if there is a setting in the settings file that does not match any variables
		}
	}
	main.updateStatus("all settings loaded");
	finishinit();
}

function settingsNotFound(e)
{
	main.updateStatusCol(e.msg,"#FF0000");		//display error message
	finishinit();
}

function doCheck(e)			//master function called every frame
{
	deepthroatactionsf();
}


function deepthroatactionsf()
{
	if(deepthroatactions == 1)
	{
		if (her.penisInMouthDist > her.deepthroatDistance && her.mouthFull)
		{
			if(justdeepthroat == 0)		//if haven't done ondeepthroat stuff yet
			{
				if(splatgenerateondeepthroat == 1)
				{
					generateSplatcustom(her.previousMovement / 10 * splatgenerateondeepthroatmovementmult + splatgenerateondeepthroatmovementbase, splatgenerateondeepthroatamount, splatgenerateondeepthroatspeedbase + her.movement / 10 * splatgenerateondeepthroatspeedmult , true);
				}
				if(splatsoundondeepthroat == 1)
				{
					g.soundControl.playSplat();
				}
				if(pleasureincreaseondeepthroat == 1)
				{
					g.him.givePleasure(Math.random() * pleasureincreaseondeepthroatrandom + pleasureincreaseondeepthroatbase);
				}
				//main.updateStatus("bonus pleasure");
				justdeepthroat = 1;
				if(!her.passedOut)
				{
					justdeepthroattimer = winceondeepthroatholdtime;
					if(passoutfactorincreaseondeepthroat == 1 && (preventpassoutincreaseswhenstillhavebreath!=1 || g.breathLevel == g.breathLevelMax))
					{
						her.passOutFactor = Math.min(her.passOutMax, her.passOutFactor + Math.random() * passoutfactorincreaseondeepthroatrandom + passoutfactorincreaseondeepthroatbase);
					}
					if(breathlevelincreaseondeepthroat == 1)
					{
						
						g.addBreath(Math.random() * breathlevelincreaseondeepthroatamountrandom + breathlevelincreaseondeepthroatamountbase);
						//main.updateStatus("added breath for on throat");
					}
					if(her.passOutFactor >= her.passOutMax)
					{
						her.passOut();
					}
					else
					{
						if(gagondeepthroat == 1 && Math.random() < gagondeepthroatpercent)
						{
							g.soundControl.playGag(her.pos);
						}
						if(winceondeepthroat == 1 && Math.random() < winceondeepthroatpercent)
						{
							her.wince();
						}
						else
						{
							if(shockondeepthroat == 1)
							{
								her.shock(shockondeepthroatamount);
								continueshockdecrease = 1;
							}
						}
						
					}
					
				}
				else
				{
					justdeepthroattimer = 0;
				}
				
			}
			else		//else if have already done ondeepthroat stuff
			{			//do inthroat stuff
				if(breathlevelincreaseinthroat == 1)
				{
					g.addBreath(Math.random() * breathlevelincreaseinthroatamountrandom + breathlevelincreaseinthroatamountbase);
				}
				if(passoutfactorincreaseinthroat == 1 && (preventpassoutincreaseswhenstillhavebreath!=1 || g.breathLevel == g.breathLevelMax))
				{
					her.passOutFactor = Math.min(her.passOutMax, her.passOutFactor + Math.random() * passoutfactorincreaseinthroatamountrandom + passoutfactorincreaseinthroatamountbase);
				}
				if(pleasureincreaseindeepthroat == 1)
				{
					g.him.givePleasure(Math.random() * pleasureincreaseindeepthroatrandom + pleasureincreaseindeepthroatbase);
				}
				if(shockondeepthroat == 1 && !her.passedOut)		//shock normalizing after onthroat
				{
					if(continueshockdecrease == 1 && continueshockdecreasehilt != 1)
					{
						//her.shock(20);
						if(her.eyelidMotion.shock <= 0)
						{
							continueshockdecrease = 0;
						}
						else
						{
							her.eyelidMotion.shock = Math.max(0, her.eyelidMotion.shock - shockondeepthroatamount*shockondeepthroateyenormalizefasterrate);
							her.eyelidMotion.shock = Math.max(0, her.eyelidMotion.shock - (shockondeepthroatamount - her.eyelidMotion.shock)*shockondeepthroateyenormalizefasterexporate);

						}
					}
				}
				if(justdeepthroattimer > 0)
				{
					justdeepthroattimer = justdeepthroattimer - 1;		//wince holding after onthroat
					if(winceondeepthroat == 1 && her.winceTimer > 0)
					{
						her.wince();
					}
				}
			}
			if(winceinthroat == 1 && !her.passedOut)
			{
				if(her.eyelidMotion.shock == 0)
				{
					her.wince();
				}
			}
			else
			{
				if(shockinthroat == 1 && !her.passedOut)
				{
					her.eyelidMotion.shock = shockondeepthroatamount;
					continueshockdecrease = 1;
				}
			}
		
		}		//end of if held
		else
		{
			if(shockondeepthroat == 1 || shockinthroat == 1)
			{
				if(continueshockdecrease == 1 && !her.passedOut && continueshockdecreasehilt != 1)
				{
					if(her.eyelidMotion.shock <= 0)
					{
						continueshockdecrease = 0;
					}
					else
					{
						her.eyelidMotion.shock = Math.max(0, her.eyelidMotion.shock - shockondeepthroatamount*shockondeepthroateyenormalizefasterrate);
						her.eyelidMotion.shock = Math.max(0, her.eyelidMotion.shock - (shockondeepthroatamount - her.eyelidMotion.shock)*shockondeepthroateyenormalizefasterexporate);

					}
				}
			}
			justdeepthroat = 0;
		}
	}
	if(hiltactions == 1)			/////////////////////////////////////////////////////////
	{
		if (her.penisInMouthDist > her.hiltDistance && her.mouthFull)
		{
			if(her.justHilt)		//onhilt stuff
			{
				if(splatgenerateonhilt == 1)
				{
					generateSplatcustom(her.previousMovement / 10 * splatgenerateonhiltmovementmult + splatgenerateonhiltmovementbase, splatgenerateonhiltamount, splatgenerateonhiltspeedbase + her.movement / 10 * splatgenerateonhiltspeedmult , true);

				}
				if(splatsoundonhilt == 1)
				{
					g.soundControl.playSplat();
				}
				if(pleasureincreaseonhilt == 1)
				{
					g.him.givePleasure(Math.random() * pleasureincreaseonhiltrandom + pleasureincreaseonhiltbase);
				}
				if(breathlevelincreaseonhilt == 1)
				{
					g.addBreath(Math.random() * breathlevelincreaseonhiltamountrandom + breathlevelincreaseonhiltamountbase);
				}
				//main.updateStatus("bonus pleasure");
				//justdeepthroat = 1;
				if(!her.passedOut)
				{
					justhilttimer = winceonhiltholdtime;
					if(passoutfactorincreaseonhilt == 1 && (preventpassoutincreaseswhenstillhavebreath!=1 || g.breathLevel == g.breathLevelMax))
					{
						her.passOutFactor = Math.min(her.passOutMax, her.passOutFactor + Math.random() * passoutfactorincreaseonhiltrandom + passoutfactorincreaseonhiltbase);

					}
					if(her.passOutFactor >= her.passOutMax)
					{
						her.passOut();
					}
					else
					{
						if(gagonhilt == 1 && Math.random() < gagonhiltpercent)
						{
							g.soundControl.playGag(her.pos);
						}
						if(winceonhilt == 1 && Math.random() < winceonhiltpercent)
						{
							her.wince();
						}
						else
						{
							if(shockonhilt == 1)
							{
								her.shock(shockonhiltamount);
								continueshockdecreasehilt = 1;
							}
						}
						
					}
					
				}
			
			}
			else					//inhilt stuff
			{
				if(breathlevelincreaseinhilt == 1)
				{
					g.addBreath(Math.random() * breathlevelincreaseinhiltamountrandom + breathlevelincreaseinhiltamountbase);
				}
				if(pleasureincreaseinhilt == 1)
				{
					g.him.givePleasure(Math.random() * pleasureincreaseinhiltrandom + pleasureincreaseinhiltbase);
				}
				if(passoutfactorincreaseinhilt == 1 && (preventpassoutincreaseswhenstillhavebreath!=1 || g.breathLevel == g.breathLevelMax))
				{
					her.passOutFactor = Math.min(her.passOutMax, her.passOutFactor + Math.random() * passoutfactorincreaseinhiltamountrandom + passoutfactorincreaseinhiltamountbase);
				}
				if(shockonhilt == 1 && !her.passedOut)		//shock normalizing after onthroat
				{
					if(continueshockdecreasehilt == 1)
					{
						her.eyelidMotion.shock = Math.max(0, her.eyelidMotion.shock - shockonhiltamount*shockonhilteyenormalizefasterrate);
						her.eyelidMotion.shock = Math.max(0, her.eyelidMotion.shock - (shockonhiltamount - her.eyelidMotion.shock)*shockonhilteyenormalizefasterexporate);
						if(her.eyelidMotion.shock <= 0)
						{
							continueshockdecreasehilt = 0;
						}		
					}
				}
				if(justhilttimer > 0)
				{
					justhilttimer = justhilttimer - 1;		//wince holding after onthroat
					
					if(winceonhilt == 1 && her.winceTimer > 0)
					{
						her.wince();
					}
				}
			}
			if(winceinhilt == 1 && !her.passedOut)
			{
				if(her.eyelidMotion.shock == 0)
				{
					her.wince();
				}
			}
			else
			{
				if(shockinhilt == 1 && !her.passedOut)
				{
					her.eyelidMotion.shock = shockonhiltamount;
					continueshockdecreasehilt = 1;
				}
			}
		}
		else
		{
			if(shockonhilt == 1 || shockinhilt == 1)
			{
				if(continueshockdecreasehilt == 1 && !her.passedOut)
				{
					her.eyelidMotion.shock = Math.max(0, her.eyelidMotion.shock - shockonhiltamount*shockonhilteyenormalizefasterrate);
					her.eyelidMotion.shock = Math.max(0, her.eyelidMotion.shock - (shockonhiltamount - her.eyelidMotion.shock)*shockonhilteyenormalizefasterexporate);
					if(her.eyelidMotion.shock <= 0)
					{
						continueshockdecreasehilt = 0;
					}
				}
			}
			//justdeepthroat = 0;
		}
	}
}


function doUnload()		//removes docheck from frame event
{
	cMC.removeEventListener(Event.ENTER_FRAME, doCheck);
}


function generateSplatcustom(param1:Number, param2:uint = 1, param3:Number = 1, param4:Boolean = false) : void
        {
			
            var _loc_9;
            var _loc_10;
            var _loc_11;
            var _loc_12;
            var _loc_13;
            var _loc_5 = g.sceneLayer.globalToLocal(her.localToGlobal(her.topLipB));
            var _loc_6 = g.sceneLayer.globalToLocal(her.head.jaw.localToGlobal(her.bottomLipA));
            var _loc_7 = new Point(_loc_5.x - _loc_6.x, _loc_5.y - _loc_6.y);
            _loc_7.x = _loc_7.x / 100;
            _loc_7.y = _loc_7.y / 100;
            var _loc_8  = 0;
            while (_loc_8 < param2)
            {
                
                _loc_9 = Math.random() * 100;
                _loc_10 = new Point(_loc_6.x + her.movement/10 + _loc_9 * _loc_7.x, _loc_6.y + _loc_9 * _loc_7.y);
                _loc_11 = (Math.random() * 2 - 1 - (_loc_9 - 50) * 0.1) * param3;
                _loc_12 = (Math.random() * 4 + param1) * param3;
                _loc_13 = Math.random() * 1.5 + 0.1;
                if (param4)
                {
					
                    g.cumLayer.addChild(new Droplet(_loc_10, new Point(_loc_12, _loc_11), _loc_13, 0.2, 1, true));
					
                }
                else if (g.spit)
                {
                    g.strandFrontLayer.addChild(new Droplet(_loc_10, new Point(_loc_12, _loc_11), _loc_13));
                }
                _loc_8 = _loc_8 + 1;
            }
            return;
        }// end function


